package com.tedu.api.list;

import org.junit.Test;

import java.util.Scanner;




/**
 * JavaSE：基础语法，JavaOOP：面向对象编程，JavaAPI{帮助文档，理解：字典}
 *
 * JavaAPI【内置：Java编辑好的】提供大量类、接口、抽象类、异常、错误
 * 【预计提供好的类库：8000、JavaAPI只学重点】
 *
 * JavaAPI：字符串、包装类、 集合【泛型】、线程、
 *         多线程【并发--提到大数据】、IO流、Socket套接字【网络编程】
 *
 * jdk1.8.chm帮助文档   理解：  新华字典   会查类、接口、抽象..使用
 * JDK版本---帮助文档   根据用什么JDK，查对应版本帮助文档
 *
 * 必须会查API    String类----什么是包下？
 *              java.lang【默认：不需要导入报】
 *
 *
 * java:错误：无效的源发行版：17
 * maven项目：自动下载：Junit版本--testng级别【识别JDK17】
 * 找到pom.xml----17
 *
 *
 */
public class StringAPI {
    /**
     * JDK1.8 StringAPI类库：构造 器怎么用，方法怎么用？
     * 包位置：java.lang【不需要导包：System、String】
     * 特点：不需要导入包、不可以继承、字符 数组、定义完毕无法
     *    修改可以覆盖String类是final，Java字符串编码集
     *    顶级uniCode GBK,UTF-8  任何字符对应的是两个字节；
     * 字符串底层：封装了字符数组 以及针对字符数组的操作算法
     * 字符数组===字符串
     * 定义：String str="直接量";  给定值创建String字符串对象
     *      String str=new String（）； 创建String字符串新对象
     */
    @Test
    public void testString(){
        String str="字符串";
        System.out.println(str);
        char[] c={'字','符','串'};  //字符数组：静态字符数组
        System.out.println(c);
        //字符串一旦创建出来：对象无法修改，因为String是final修饰
        String s="Hello world";
        s="123";   //对对象进行覆盖
        System.out.println(s);
    }
    /**
     * 定义给定值的方式：String str="java123"
     *
     *                           静态字符串（字面量|常量|链接后结果）
     * 创建在String常量池中，对于重复创建静态字符串，JVM虚拟机首先
     * 会在常量池中查找，如果找到就返回对象，找不到继续创建对象！
     * JVM会在虚拟机堆内存当中开辟一块空间，保存曾经使用过的字面量|常量
     * 一旦后期又实用相同的字面量|常量，不会创建新对象，直接用老对象
     * 好处：减少内存开销，提高性能
     */
    @Test
    public void testStrings(){
        String s1="java123";//公共常量池
        String s2="java123";//不会创建对象，从常量池java123
        System.out.println(s1==s2);//true
        String s="java";//s对象 不可修改
        String s3="123";//s3对象=s+“123”；  s3新对象
        System.out.println(s1==s3);//java123 ==java123 true
        String s4="java"+"123";
        System.out.println(s2==s4);
        //s2的java123从常量池中获取.s4拼接后静态字符串，从常量池中获取
        //---------上面的代码：给定值定义字符串方式：拥有常量池----------
        //---------下面的代码：创建字符串对象方式
        String s5=new String("java123");

        //new出来的对象，一定是新对象，不存在常量池
        System.out.println(s4==s5);
    }
    /**
     * String API 方法
     * length方法    返回值：int
     * 作用：返回当前字符串的长度（个数）---借鉴于数组length方法
     * 特点：字符串包含：特殊字符空格、字母、汉子
     *       String对象采用Uincode顶级编码：每个字符算一个，占2个字节
     */
    @Test
    public void testLength(){
        String str="Hello World";//10
        System.out.println(str.length());
        str=" 我爱java";
        System.out.println(str.length());//7
    }
/**
 * indexOf方法 ---- 重载功能：修饰符 返回值 方法名一致
 *                                     参数不一致
 *indexOf(String str)     返回值int
 * 第一个参数String index：传入下标位
 * 作用：查找指定字符串在当前字符串中位置，首位置，
 *      如果匹配到对应的字符，输出首位置下标
 *
 *      如果没有匹配到对应的字符，返回值-1
 *indexOf(String str，int index)     返回值int
 * 第一个参数String str：传入指定字符串
 * 第二个参数int index：查找指定具体位置的下标
 * 作用：查找“具体下标”的“字符串”在“当前字符串”中位置，首位置
 *      如果查找相同名称，向下查找，不包含当前位置
 *      如果没有匹配到对应的字符，返回值-1
 *lastIndexOf(String str)方法
 * 作用：找到匹配字符串中对应最后出现子字符串位置
 */
@Test
public void testIndexOf(){

    String str="thinking in java";//java编程思想【第四版】
    //返回值：下标位
    int index=str.indexOf("ja");//用处：查找第一位相同
    System.out.println("打印下标位："+index);
    index=str.indexOf("in",6);
    //用处：查找指定某一位相同

    System.out.println("指定下标位:"+index);

    //lastIndexOf()找到最后一次出现的下标位置

    index=str.lastIndexOf("in");
    System.out.println("最后的下标位："+index);

}
    /**StringAPI针对字符串提供三种方法：截取、替换、分割【常用方法】
     * subString方法 截取   返回值：String
     * subString（int start、int end）
     * 作用：截取字符串，从下标start位置开始截取，截取到end下标位置
     * subString（int index）
     * 作用：截取字符串，从下标index位置开始截取，截取到最后
     * 通用口诀：含头不含尾
     */
    @Test
    public void testSubString(){

        String url="www.baidu.com";//需要：通过截取字符串baidu

        // url=url.substring(9,12);   //.baidu.  .co
        System.out.println("截取字符串："+url);
        //需求：通过截取字符串.com
        url=url.substring(9);
        System.out.println("截取字符串，截取到最后"+url);

    }
    /**
     * charAt（int index）方法   返回值char
     * 作用：返回当前字符串中指定位置的字符
     * StringIndexOutOfBoundsException 异常
     * 字符串下标越界异常---出现原因：下标超出范围
     */
    @Test
    public void testCharAt(){
        String str="think in java";
        char c=str.charAt(1);
        System.out.println("获取对应字符："+c);
    }
    /**
     * trim方法 返回值String
     * 作用：去掉当前字符串前后空格【转大小写叠加使用】
     * 统一大小写，去掉空格后
     * 作用：将自传中所有只支付转换为小写
     *
     * 验证码：xD4e 前台显示：xD4e   用户输入：xD4e
     */
    /**
     *  @Test
     *
     *     public void testTrim(){
     *         String str=" xD4e ";//后台出入前后都加空格，xD4e
     *         //后台传入前台字符串---一律空
     *         str=str.trim().toLowerCase();
     *         System.out.println("去掉空格:"+str);
     *     }
     */
    /**
     * [PHP-前段]正则表达式：语法-元字符 ^ $  ^[0~9]*$
     * 验证字符串
     * matches方法
     * 作用：用于验证字符串，使用正则表达式进行验证【过滤字符】
     *      返回true正则验证成功，返回false正则验证失败
     */
    public static void main(String[] args) {
        String regex="^\\d{15}|\\d{18}$";
        System.out.println("请输入:");
        //从控制台输入【模拟用户输入】 "123"
        Scanner input=new Scanner(System.in);
        //判断，如果正则通过，返回是数字，反之相反
        if(input.nextLine().matches(regex)){
            System.out.println("是正确身份证号");
        }else{
            System.out.println("不是正确身份证号~");
        }
    }

    /**
     * replace方法   替换   返回值String
     * replace(String a,String b)
     * 第一个参数  String a 传入替换字符
     * 第二个参数  String b 传入查找字符
     * 作用：用于匹配字符串当中存在字符，匹配成功，替换成新字符
     *
     * replaceAll(String regex,String a)
     * 作用：用于匹配全部字符串存在字符，按照正则匹配，替换成新字符
     */
    @Test
    public void testReplace(){
        String str="我爱Java";//需求：Java替换Python
        str=str.replace("Java","Python");
        System.out.println("替换后的字符串："+str);

        String regex="^[\\u4e00-\\u9fa5]{0,}$";//验证汉字
        String say="我去年买了块表";
        say=say.replaceAll(regex,"*****");
        System.out.println("通过验证后替换字符串："+say);
    }
    /**
     * split方法   分割   返回值：String【】
     *
     * 作用：用于按照“正则”或者“字符串”的方式分割字符串
     *
     *   www.baidu.com   按照点的方式获取
     *
     *   split写，  代表证则代表式：  匹配一个字符
     *
     *   split写，  注意：转义成\\.
     */
    @Test
    public void testSplit(){

        String url="www.baidu.com";//不需要知道下标的情况，获取baidu
        String[] urls=url.split("\\.");
        System.out.println("获取元素值："+urls[1]);//获取baidu
        //思考：代码哪里出现错误 ArrayIndexOutOfBoundsException
        //打印字符串数组--增强for  数组数据类型 引用：遍历数组引用
        for(String s:urls){
            System.out.println("分割后元素值："+s);

        }
    }
    /**
     * valueOf()
     */
    @Test
    public void testValueOf(){

        int i=123; //基础数据类型转换为字符串
        String s=String.valueOf("i");
        if(s.equals("123")) {// s对象=="123"  判断对象   false
            // s对象.equals("123")  判断值 true
            System.out.println("是字符串");
        }else{

            System.out.println("不是字符串");


        }

        //String API 没有讲全----会查API

    }
}
